package com.qfedu.edu.messagecenterserver.mqtt.observer.impl;

import com.alibaba.fastjson2.JSON;
import com.qfedu.edu.bo.HardwareMessageBo;
import com.qfedu.edu.constance.RedisConstance;
import com.qfedu.edu.manager.RedisManager;
import com.qfedu.edu.mqtt.data.MqttMessage;
import com.qfedu.edu.messagecenterserver.mqtt.observer.base.Observer;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;

/**
 * @author xiaobobo
 * @title: SaveDataObserver
 * @projectName cd-fy-2401-third-project-parent
 * @description: 这个就是数据保存的这个观察者
 * @date 2024/10/9  17:35
 */
@Component
@Slf4j
public class SaveDataObserver implements Observer {

    @Autowired
    private RedisManager redisManager;

    @Override
    public void notifyHandler(MqttMessage mqttMessage) {
        log.info("数据正在保存");
        /**
         * 这里的硬件数据我们是存储到 Redis中
         * 这里我们采用存储固定数量的数据到 Redis
         *
         * List
         *     lpush   rpop
         *
         *  设计：数据的存储
         *
         *  集合的名字： hardware:msg:save:设备key   数据(JSON)
         *
         */
        String payload = mqttMessage.getMessagePayload().getPayload();
        HardwareMessageBo hardwareMessageBo = JSON.parseObject(payload, HardwareMessageBo.class);
        String device = hardwareMessageBo.getDevice();
        //构建集合的名字
        String listName= RedisConstance.getHardwareSaveListPrefix()+device;
        //取出这个硬件的数据
        String hardwareData = JSON.toJSONString(hardwareMessageBo.getData());
        //先判断这个数据的个数是不是大于了10000条
        long count = redisManager.countList(listName);
        if(count>=10000){
            redisManager.listRightPop(listName);
        }
        //然后存储这个数据到Redis
        redisManager.addList(listName,hardwareData);
        log.info("硬件数据保存完成....");
    }
}
